package demo;

// 多线程抢票实例: 多个线程操作同一资源情况下， 线程不安全，数据紊乱,如何解决？
// 1.sychrnoized
// 2.lock
// 3.volatile 保证可见性、不保证原子（sychrnoized/lock/原子包装类可以保证原子性）、禁止指令重排
public class RobTickets implements Runnable{

    // 票数
    private int num = 10;

    // 抢票
    public void run() {
        robTicket();
    }


    private void robTicket() {
        while (num > 0){
            num --;
            System.out.println(Thread.currentThread().getName()+":抢到票了，剩余:"+num);
        }
        System.out.println(Thread.currentThread().getName()+":票已经卖完了！！！！！！！！");
    }


    public static void main(String[] args) {
        // 资源类：票（属性） 方法（抢票）
        RobTickets tickets = new RobTickets();
        // 老师抢票
        new Thread(tickets,"老师1").start();
        // 学生抢票
        new Thread(tickets,"学生1").start();
        new Thread(tickets,"老师2").start();
        new Thread(tickets,"学生2").start();
    }
}
